/*
 * Copyright (C) 2010-2010 MaoJian Wu
 *
 * Author:
 *	MaoJian Wu
 *
 * Source:
 *	
 *
 * This file is a part of zfspear library.
 *
 *
 */

#ifndef XMPP_ELEMENT_H
#define XMPP_ELEMENT_H

#include <QString>
#include <QHash>
#include <QDomElement>
#include <QObject>
#include <QXmlStreamWriter>
#include <QDomDocument>
#include "xmpp_dom_element.h"
#include "xmpp_uri.h"

class XmppElement : public QObject {
    Q_OBJECT
public:
    Q_INVOKABLE XmppElement(const QString& tagName,const QString& ns="", QObject* parent=0);

    void SetTagName(const QString& name);
    QString TagName() const;
    QString Prefix();
    void SetPrefix(const QString& prefix);
    QString Xmlns();
    void SetXmlns(const QString& ns);


    QString Attribute(const QString& name) const;
    void SetAttribute(const QString& name, const QString& value);
    void SetAttribute(const QString& name, qlonglong value);
    void SetAttribute(const QString& name, qulonglong value);
    inline void SetAttribute(const QString& name, int value)
        { SetAttribute(name, qlonglong(value)); }
    inline void SetAttribute(const QString& name, uint value)
        { SetAttribute(name, qulonglong(value)); }
    void SetAttribute(const QString& name, float value);
    void SetAttribute(const QString& name, double value);
    void RemoveAttribute(const QString& name);
    bool HasAttribute(const QString& name) const;
    XmppElement* ParentXmppElement();
    bool IsNull();
    void SetValue(const QString& value);
    QString Value();
    QList<XmppElement*> SelectElements(const QString& tagName);
    QList<XmppElement*> SelectElements(const QString& tagName, bool traverseChildren);
    XmppElement* SelectElement(const QString& tagName);
    XmppElement* SelectElement(const QString& tagName, bool traverseChildren);

    QString GetTag(const QString& tagName);
    void SetTag(const QString& tagName);
    void SetTag(const QString& tagName,const QString& text);
    void AddTag(const QString& tagName);
    void AddTag(const QString& tagName,const QString& text);
    bool HaveTag(const QString& tagName);
    bool RemoveTag(const QString& tagName);
    QString ToString();
    QByteArray ToByteArray();
    QList<XmppElement*> ChildElements();
    int ChildsCount();

    void AppendChild(XmppElement* xmppElement);
    void RemoveChild(XmppElement* xmppElement);

    ~XmppElement();
    QDomElement  dom_;
protected:
    void CreateDom(const QString& tagName,const QString& ns="");
private:
    void WriteTree(XmppElement *element,XmppElement *parent,QXmlStreamWriter& writer);
    XmppElement* SelectElement_(XmppElement* element, QString tagname, bool traverseChildren);
    XmppElement* parentElement_;
    QDomDocument domDoc_;
    QList<XmppElement*> childsList_;

};

#endif // XMPP_ELEMENT_H
